<?php

/**
 * Classe para conexão com banco de dados MySQL.
 * @author Bruno E. Fuhr [brunofuhr@yahoo.com.br]
 */
class FMySQLConnection
{
    private $schema;
    private $user;
    private $password;
    private $host;
    private $port;
    protected $db;
    protected $error;

    /**
     * Método construtor da classe.
     * @param $schema - Nome do esquema ao qual será feita a conexão.
     * @param $user - Usuário do mysql.
     * @param $password - Senha do mysql.
     * @param $host - Host do servidor do mysql.
     * @param $port - Porta do servidor do mysql.
     */
    public function __construct($schema = 'mysql', $user = 'root', $password = '', $host = '127.0.0.1', $port = '3306')
    {
        $this->schema = $schema;
        $this->user = $user;
        $this->password = $password;
        $this->host = $host;
        $this->port = $port;
        $this->connect();
    }

    /**
     * Método que faz a conexão com o SGDB.
     */
    private function connect()
    {
        // Tenta fazer a conexão.
        try
        {
            $conn = mysql_connect($this->host . ':' . $this->port, $this->user, $this->password);
            if ( $conn )
            {
                $this->db = mysql_select_db($this->schema, $conn);
            }
        }
        // Caso ocorra algum erro, coloca a mensagem na variável, para debug.
        catch ( Exception $e )
        {
            $this->error = $e->getMessage();
        }
    }

    /**
     * Método que retorna a conexão.
     */
    public function getConnection()
    {
        return $this->db;
    }

    /**
     * Método que executa um sql na base e retona um array com as posições dos campos.
     */
    public function query($sql)
    {        
        if ( !$this->db )
        {
            FUtil::log(FALHA_NA_CONEXAO);
            $this->error = FALHA_NA_CONEXAO;
            return null;
        }
        else
        {
            try
            {
                $query = mysql_query($this->db, $sql);
                $result = mysql_fetch_assoc($query);
            }
            catch ( Exception $e )
            {
                FUtil::log($e->getMessage());
                $this->error = $e->getMessage();
            }
        }

        if ( !$result )
        {
            $this->error = mysql_error($this->db);
        }

        return $result;
    }

    /**
     * Método que executa um sql na base e retorna verdadeiro se a função foi executada com sucesso.
     */
    public function execute($sql)
    {
        if ( !$this->db )
        {
            $this->error = FALHA_NA_CONEXAO;
            $result = false;
        }
        else
        {
            try
            {
                // Inicia a transação.
                mysql_query($this->db, 'BEGIN');

                // Executa o comando.
                $result = mysql_query($this->db, $sql);

                // Testa e faz o tratamento apropriado: COMMIT ou ROLLBACK
                if ( !$result )
                {
                    $this->error = mysql_error($this->db);
                    mysql_query($this->db, 'ROLLBACK');
                    $result = false;
                }
                else
                {
                    mysql_query($this->db, 'COMMIT');
                    $result = true;
                }
            }
            catch ( Exception $e )
            {
                $this->error = $e->getMessage();
            }
        }

        return $result;
    }

    /**
     * Método que retorna o erro de um comando sql.
     */
    public function getError()
    {
        return $this->error;
    }
    
}

?>
